package cn.shadow.beans;

import java.util.List;
import java.util.Map;

/**
 * Bean工厂
 * @author 冯啸迪
 */
public interface BeanFactory {

    /**
     * 获取Bean
     * @param beanName Bean名称
     * @return 返回Bean对象
     * @throws Throwable 异常
     */
    Object getBean(String beanName) throws Throwable;


    /**
     * 根据类型获取Bean
     * @param type 类型
     * @return Bean的实力对象
     * @param <T> 泛型
     * @throws Throwable 抛出异常
     */
    <T> T getBean(Class<T> type) throws Throwable;

    /**
     * 根据Type获取Bean实例的列表
     * @param clazz 类型
     * @return 返回实例Map
     * @param <T> 泛型
     * @throws Throwable 异常
     */
    <T> Map<String, T> getBeansByType(Class<T> clazz) throws Throwable;

    /**
     * 通过Bean名称获取Bean的类型
     * @param beanName Bean名称
     * @return 返回bean的类型
     * @throws Exception 抛出异常
     */
    Class<?> getType(String beanName) throws Exception;

    /**
     * 注册后置方法
     * @param beanPostProcessor 后置处理器
     */
    void registerBeanPostProcess(BeanPostProcessor beanPostProcessor);

    /**
     * 根据类型获取一个Bean列表
     * @param type 类型
     * @return 实例列表
     * @param <T> 泛型
     * @throws Throwable 抛出异常
     */
    <T> List<T> getBeansByTypeList(Class<T> type) throws Throwable;
}
